#include "msgq.h"
#include "bank.h"
#include <string.h>
#include <stdlib.h>
#include "tools.h"

int msgid = 0;
MSG_CTOS ctos = {};
MSG_STOC stoc = {};

int main_menu(void)
{
	system("clear");
	puts("***欢迎使用指针银行***");
	puts("1、开户	2、销户");
	puts("3、解锁	4、登录");
	puts("5、退卡");
	return get_cmd('1','5');
}

void open_acc(void)
{
	// 准备数据
	printf("请输入您的身份证号\n");
	printf(">>");
	gets(ctos.acc.card);
	printf("请输入您的密码\n");
	printf(">>");
	gets(ctos.acc.pass);
	
	ctos.type = MSGTY_OPEN;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("success",stoc.info))
	{
		printf("开户成功\n");
		printf("卡号：%s\n",stoc.acc.id);
		printf("持有人身份证号：%s\n",stoc.acc.card);
		printf("密码：%s\n",stoc.acc.pass);
		printf("余额：%lf\n",stoc.acc.balance);
	}
	else puts("系统维护中\n");
	anykey_continue();
}

void destory(void)
{
	// 准备数据
	printf("请输入您的帐号\n");
	printf(">>");
	gets(ctos.acc.id	);
	printf("请输入您的身份证号\n");
	printf(">>");
	gets(ctos.acc.card);
	printf("请输入您的密码\n");
	printf(">>");
	gets(ctos.acc.pass);
	
	ctos.type = MSGTY_DESTORY;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("success",stoc.info)) printf("销户成功\n");
	else if(0 == strcmp("false",stoc.info)) printf("帐号不存在\n");
	else if(0 == strcmp("card",stoc.info)) printf("身份错误\n");
	else if(0 == strcmp("pass",stoc.info)) printf("密码错误\n");
	else puts("系统维护中\n");
	anykey_continue();
}

void unlock(void)
{
	// 准备数据
	printf("请输入您的帐号\n");
	printf(">>");
	gets(ctos.acc.id	);
	printf("请输入您的身份证号\n");
	printf(">>");
	gets(ctos.acc.card);
	printf("请输入您的密码\n");
	printf(">>");
	gets(ctos.acc.pass);
	
	ctos.type = MSGTY_UNLOCK;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("success",stoc.info)) printf("解锁成功\n");
	else if(0 == strcmp("false",stoc.info)) printf("帐号不存在\n");
	else if(0 == strcmp("card",stoc.info)) printf("身份错误\n");
	else if(0 == strcmp("pass",stoc.info)) printf("密码错误\n");
	else puts("系统维护中\n");
	anykey_continue();
}

int sub_menu(void)
{
	system("clear");
	printf("*** 用户：%s ***\n",stoc.acc.id);
	puts("1、查询	2、存款");
	puts("3、取款	4、转账");
	puts("5、改密	6、退卡");
	return get_cmd('1','6');
}

void query(void)
{
	ctos.type = MSGTY_QUERY;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	if(0 == strcmp("success",stoc.info))
	{
		printf("卡号：%s\n",stoc.acc.id);
		printf("持有人身份证号：%s\n",stoc.acc.card);
		printf("密码：%s\n",stoc.acc.pass);
		printf("余额：%lf\n",stoc.acc.balance);
	}
	else puts("系统维护中\n");
	anykey_continue();
}

void save(void)
{
	printf("请输入存款金额：\n");
	printf(">>");
	scanf("%lf",&ctos.acc.balance);
	
	ctos.type = MSGTY_SAVE;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("success",stoc.info))
	{
		printf("存款成功\n");
		printf("余额：%lf\n",stoc.acc.balance);
	}
	else puts("系统维护中\n");
	anykey_continue();
}

void take(void)
{
	printf("请输入取款金额：\n");
	printf(">>");
	scanf("%lf",&ctos.acc.balance);
	
	ctos.type = MSGTY_TAKE;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("success",stoc.info))
	{
		printf("取款成功\n");
		printf("余额：%lf\n",stoc.acc.balance);
	}
	else if(0 == strcmp("needmore",stoc.info)) printf("余额不足\n");
	else puts("系统维护中\n");
	anykey_continue();
	
}

void transfer(void)
{
	//准备数据1
	printf("请输入转账金额：\n");
	printf(">>");
	scanf("%lf",&ctos.acc.balance);
	getchar();
	printf("请输入目标帐号\n");
	printf(">>");
	gets(ctos.acc.id2);
	
	ctos.type = MSGTY_TRANSFER;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("needmore",stoc.info)) printf("余额不足\n");
	else if(0 == strcmp("success",stoc.info))
	{
		printf("转账成功\n");
		printf("余额：%lf\n",stoc.acc.balance);
	}
	else if(0 == strcmp("vip",stoc.info)) printf("目标账户不存在\n");
	else puts("系统维护中\n");
	anykey_continue();
}

void repass(void)
{
	printf("请输入新密码：\n");
	printf(">>");
	gets(ctos.acc.pass);
	
	ctos.type = MSGTY_REPASS;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("success",stoc.info)) printf("改密成功\n");
	else puts("系统维护中\n");
	anykey_continue();
}

void login(void)
{
	// 准备数据
	printf("请输入您的帐号\n");
	printf(">>");
	gets(ctos.acc.id	);
	printf("请输入您的密码\n");
	printf(">>");
	gets(ctos.acc.pass);
	ctos.type = MSGTY_LOGIN;
	send_msg(msgid,&ctos,sizeof(MSG_CTOS));
	recv_msg(msgid,&stoc,sizeof(MSG_STOC),ctos.return_type);
	// 根据返回结果给用户显示信息
	if(0 == strcmp("lock",stoc.info)) printf("帐号已锁定，请解锁\n");
	else if(0 == strcmp("success",stoc.info))
	{
		printf("登陆成功\n");
		anykey_continue();
		for(;;)
		{
			switch(sub_menu())
			{
				case '1': query(); break;
				case '2': save(); break;
				case '3': take(); break;
				case '4': transfer(); break;
				case '5': repass(); break;
				case '6': 
				{
					printf("程序退出中。。。\n");
					sleep(1);
					anykey_continue();
					exit(0);
				}
			}
		}
	}
	else if(0 == strcmp("false",stoc.info)) printf("帐号不存在\n");
	else if(0 == strcmp("pass",stoc.info)) printf("密码错误\n");
	else puts("系统维护中\n");
	anykey_continue();
}

int main()
{
	msgid = get_msg(ACCOUNT_PATH,SUBP_CNT);
	ctos.return_type = getpid();
	for(;;)
	{
		switch(main_menu())
		{
			case '1': open_acc(); break;
			case '2': destory(); break;
			case '3': unlock(); break;
			case '4': login(); break;
			case '5': return 0;
		}
	}
}
